package controller

import (
	"coursedesign/projectGo/common"
	"coursedesign/projectGo/model"
	"coursedesign/projectGo/response"
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"strconv"
)

type IStoreController interface {
	RestController
}

type StoreController struct {
	DB *gorm.DB
}

func NewStoreController() IStoreController {
	db := common.GetDB()
	return StoreController{DB: db}
}

func (s StoreController) Create(c *gin.Context) { // 创建仓库
	var requestStore model.Store
	c.ShouldBindJSON(&requestStore)
	if requestStore.ID <= 0 {
		response.Fail(c, "仓库号不可为空/0", nil)
		return
	}

	result := s.DB.Find(&requestStore).RowsAffected
	if result != 0 {
		response.Fail(c, "仓库已存在", nil)
		return
	}
	err := s.DB.Create(&requestStore).Error
	if err != nil {
		response.Fail(c, err.Error(), nil)
		return
	}

	response.Success(c, gin.H{"store": requestStore}, "创建成功")
}

func (s StoreController) Update(c *gin.Context) { // 更新所有值（简单）
	// 绑定body中参数（更新后的值）
	var requestStore model.Store
	c.ShouldBind(&requestStore)
	fmt.Println(requestStore)
	if requestStore.ID == 0 {
		response.Fail(c, "仓库号不可为空/0", nil)
		return
	}
	result := s.DB.Where(&requestStore).First(&model.Store{}).RowsAffected
	if result != 0 {
		response.Fail(c, "仓库已存在", nil)
		return
	}

	// 获取path中的参数（要更新的值）
	storeId, _ := strconv.Atoi(c.Params.ByName("id")) // 强制转换为数字
	var updateStore model.Store

	// 更新
	err := s.DB.Model(&updateStore).Where("id=?", storeId).Updates(&requestStore).Error
	if err != nil {
		response.Fail(c, err.Error(), nil)
		return
	}
	response.Success(c, gin.H{"store": requestStore}, "修改成功")
}

func (s StoreController) PageList(c *gin.Context) { // 分页给数据
	idStr, _ := c.GetQuery("id")
	id, _ := strconv.Atoi(idStr)
	if id != 0 {
		var selectStore model.Store

		// 查询
		err := s.DB.Model(&selectStore).Where("id=?", id).First(&selectStore).Error
		if err != nil {
			response.Fail(c, err.Error(), nil)
			return
		}
		response.Success(c, gin.H{"store": selectStore}, "查询成功")
		return
	}
	// 获取分页参数
	tempNum, _ := c.GetQuery("pagenum")
	tempSize, _ := c.GetQuery("pagesize")
	pageNum, _ := strconv.Atoi(tempNum)   // 当前页数
	pageSize, _ := strconv.Atoi(tempSize) // 页内个数
	if pageNum == 0 || pageSize == 0 {
		pageNum = 1
		pageSize = 10
	}
	// 分页
	var stores []model.Store
	s.DB.Order("id").Offset((pageNum - 1) * pageSize).Limit(pageSize).Find(&stores)

	// 前端渲染分页也要知道总数
	var total int64
	s.DB.Model(model.Store{}).Count(&total)

	response.Success(c, gin.H{"data": stores, "total": total}, "查询成功")
}

func (s StoreController) Delete(c *gin.Context) { // 删除仓库
	// 获取path中的参数（仓库号）
	storeId, _ := strconv.Atoi(c.Params.ByName("id")) // 强制转换为数字
	var deleteStore model.Store

	// 删除
	err := s.DB.Model(&deleteStore).Where("id=?", storeId).Delete(&deleteStore).Error
	if err != nil {
		response.Fail(c, err.Error(), nil)
		return
	}
	response.Success(c, nil, "删除成功")
}
